package me.peng.service.impl;


import me.peng.domain.config.SysResult;
import me.peng.service.FileService;
import me.peng.service.vo.ImageVO;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.UUID;

@Service
//@PropertySource("classpath:/image.properties")
public class FileServiceImpl implements FileService {

    /**
     * 完成校验:
     *  1.校验是否为图片
     *  2.木马.exe.jpg 判断是否满足图片固有属性 高度/宽度
     *
     * @param file
     * @return
     */
    public static StringBuilder list=new StringBuilder();
//    @Value("${image.localDir}")
    //    @Value("${image.preUrl}")C:\eladmin\avatar\

//    static String localDir="C:/eladmin/avatar/";
//    String preDir="http://localhost:8083/avatar/";

    static String localDir="/home/eladmin/avatar/";
    String preDir="http://106.15.74.249/avatar/";

    @Override
    public ImageVO upload(MultipartFile file) {

        //1.获取图片名称    filename: abc.jpg
        //输入流
        String fileName = file.getOriginalFilename();
        fileName=fileName.toLowerCase();
         //利用正则判断是否为图片.
        //如果不是图片,则返回null
        if(!fileName.matches("^.+\\.(jpg|png|gif)$")){


            return null;
        }

        //2.检查文件是否为恶意程序.
        try {

            BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
            int width = bufferedImage.getWidth();
            int height = bufferedImage.getHeight();
            if(width == 0 || height == 0){
                //说明文件不是图片.
                return null;
            }


            //3.根据时间实现目录的创建 时间--yyyy/MM/dd
//            String dateDir = new SimpleDateFormat("/yyyy/MM/dd/")
//                    .format(new Date());
            // "D:/images/2021/11/11
            String localDirPath = localDir;
            //创建目录
            File dirFile = new File(localDirPath);
            if(!dirFile.exists()){
                dirFile.mkdirs();
            }

            //4.将文件名替换为UUID 唯一识别码
            String uuid= UUID.randomUUID().toString().replace("-","");
            int index=fileName.lastIndexOf(".");
            String filetype=fileName.substring(index);
            //文件名+文件类型=文件全名
            String newFileType=uuid+filetype;

            //5实现文件上传
            //目录+文件名称=磁盘地址
            String readFilePath=localDirPath+newFileType;
            //输出流 oj
            file.transferTo(new File(readFilePath));
            System.out.println("上传成功");
             /*
                 6.封装返回值
             *  封装虚拟路径 在各个系统之间可以灵活切换,只保存动态变化的目录
             *  path = 时间/uuid.type
             *  virurlPath=文件名.jpg
             */
            String virtualPath = newFileType;
            //网络地址： 域名/ip + 虚拟地址varturaPath
            String url = preDir+virtualPath;
            System.out.println("磁盘地址:"+readFilePath);
            System.out.println("网络地址:"+url);

            return new ImageVO(virtualPath,url,readFilePath);

        } catch (IOException e) {
            e.printStackTrace();
            //表示程序有问题
            return null;
        }


    }





    /**
     * 实现思路:
     *      1.根据虚拟地址,拼接磁盘地址
     *      2.判断文件是否存在
     *      3.实现文件删除
     * @param virtualPath
     */
    @Override
    public void deleteFile(String virtualPath) {
        //1.生成本地磁盘地址
        String path = localDir + virtualPath;
        File file = new File(path);
        if (file.exists()) {
            file.delete();
        }

    }

    //供其它方法调用,删除文件
    public  static   void deleteFileData(String paths) {
        //1.生成本地磁盘地址   分割
        String[] virtualPath=paths.split("/");
        //获取最后的文件民和后缀
        String path = localDir + virtualPath[virtualPath.length-1];
        File file = new File(path);
        if (file.exists()) {
            file.delete();
        }

    }
}
